#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 310;
string a, b;
int a1[maxn];
int b1[maxn];
int aa[maxn];
int bb[maxn];
int res[maxn];
bool flag;
void solve(){
	cin>>a;
	cin>>b;
	if(a[0]=='-'){
		a=a.substr(1, a.length()-1); // 去掉负号
	}
	if(b[0]=='-'){
		b=b.substr(1, b.length()-1); // 去掉负号
	}
	
	// 这里需要非常注意, 因为数值比大小首先需要注意的就是 长度, 其次再比较字典序
	// 这与 字符串直接比大小还不一样, 字符串比较的是字典序 
	// 这里面错了, 基本上就 爆 0 了
	if(a.length()<b.length()||a<b){ 
		swap(a, b); // 确保 a > b
		flag=true; // 表示最终结果是负值
	} else if(a==b){
		cout<<0<<'\n';
		return;
	}
	int len1=a.length();
	int len2=b.length();
	// 先得到 a, 都从第 300 位开始放
	int cnt=0;
	for(int i=len1-1;i>=0;i--){ 
		a1[300-cnt]=a[i]-'0';
		cnt++;
	}
	// 同理得到 b
	cnt=0;
	for(int i=len2-1;i>=0;i--){ 
		b1[300-cnt]=b[i]-'0';
		cnt++;
	}
	// 计算 a*a
	for(int i=300;i>=300-len1+1;i--){
		for(int j=300;j>=300-len1+1;j--){
			aa[i+j-300]+=a1[i]*a1[j];
		}
	}
	// 进位
	int carry=0;
	for(int i=300;i>=0;i--){
		aa[i]+=carry;
		carry=aa[i]/10;
		aa[i]%=10;
	}
	// 计算 b*b
	for(int i=300;i>=300-len2+1;i--){
		for(int j=300;j>=300-len2+1;j--){
			bb[i+j-300]+=b1[i]*b1[j];
		}
	}
	// 同样进位
	carry=0;
	for(int i=300;i>=0;i--){
		bb[i]+=carry;
		carry=bb[i]/10;
		bb[i]%=10;
	}
	// 开始 a*a - b*b
	for(int i=300;i>=0;i--){
		if(aa[i]<bb[i]){ // 借位
			aa[i]+=10;
			aa[i-1]-=1;
		}
		aa[i]-=bb[i];
	}
	int pos=0;
	for(int i=0;i<=300;i++){
		if(aa[i]>0){
			pos=i; // 消去前导 0
			break;
		}
	}
	if(flag){
		cout<<"-";
	}
	for(int i=pos;i<=300;i++){
		cout<<aa[i];
	}
	cout<<'\n';
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
